#include "../include/gpio.h"
/*
    gpios:哪个组的
    init : gpio引脚初始化的结构体
*/
void hal_gpio_init(gpio_t *gpios, gpio_init_t *init)
{
    // 获取引脚的编号 , 一次可以初始化多个gpio引脚
    unsigned int pin;
    for (pin = 0; pin < 16; pin++) {
        if (init->pins & (0x1 << pin)) {
            gpios->MODER &= ~(0x3 << (pin*2));
            gpios->MODER |= (init->mode << (pin*2));

            gpios->OTYPER &= ~(0x1 << pin);
            gpios->OTYPER |= (init->type << pin);

            gpios->OSPEEDR &= ~(0x3 << (pin*2));
            gpios->OSPEEDR |= (init->speed << (pin*2));
            
            gpios->PUPDR &= ~(0x3 << (pin*2));
            gpios->PUPDR |= (init->pupd << (pin*2));
        }
    }
}
/*
    gpios:哪个组的
    pins：哪个gpio引脚
    status:引脚的输出的状态
*/
void hal_gpio_write(gpio_t * gpios, unsigned int pins, gpio_status_t status)
{
    if (status != GPIO_SET) {
        gpios->ODR &= ~(pins);
    } else {
        gpios->ODR |= pins;
    }
}
/*
    gpios:哪个组的
    pins：哪个gpio引脚
    
    返回值：引脚的输入的状态
*/
gpio_status_t hal_gpio_read(gpio_t * gpios, unsigned int pins)
{
    gpio_status_t retval;
    if (gpios->IDR & pins) {
        retval = GPIO_SET;
    } else {
        retval = GPIO_RESET;
    }
    return retval;
}